package com.singleton.doublecheck;

/**
 * 双重检查方式 - 线程安全且效率高
 * 1 构造方法私有
 * 2 静态变量（自己） - 要加volatile关键字
 * 3 public static getInstance 里面检查
 *      a 外层if判断是否创建过了对象，主要是为了提升效率，不用再频繁进入同步代码块
 *      b 内层if就是判断，是否创建了对象，没有就创建
 */
public class Singleton_06 {
    public static void main(String[] args) {
        //测试
        Single06 instance1 = Single06.getInstance();
        Single06 instance2 = Single06.getInstance();
        //引用类型的 == 比较的是地址值
        System.out.println(instance1 == instance2);
        System.out.println("instance1 hashcode : "+instance1);
        System.out.println("instance2 hashcode : "+instance2);
    }
}

class Single06{

   //1 构造方法私有
    private Single06(){}

    //2 静态变量
    private static Single06 single06 ;

    //3 public static getInstance 得到单例对象
    public static Single06 getInstance(){
        if (single06 == null){ //防止频繁进入同步代码块
            synchronized (Single06.class){
                if (single06 == null){
                    single06 = new Single06();
                }
            }
        }
        return single06;
    }
}



